/**
 * 页面基类 => 高阶组件
 */
import Taro, { hideLoading as _hideLoading, setNavigationBarTitle as _setNavigationBarTitle, showToast as _showToast } from "@tarojs/taro-h5";
import { waitAppInit, goToErrorPage, awtAsyncFunc } from '../../utils/index';
import Store from '../../store/index';
const UseBasePage = () => {
  // 初始化流程
  const onload = async (callback, pageTitle) => {
    // 等待程序初始化完成
    let initRs = await waitAppInit();
    // 程序初始化失败，不再向下执行
    if (!initRs) return 'stop';
    // 页面逻辑加载
    let pageRs = await callback().catch(ex => {
      // 页面加载失败
      Store.isInit = true;
      console.log('页面加载失败:', ex);
      goToErrorPage(500);
      return true;
    });
    _hideLoading();
    if (pageRs) {
      Store.isInit = true;
    } else {
      Store.pageIsReady = true;
      _setNavigationBarTitle({
        title: pageTitle
      });
    }
  };
  // 统一异常拦截，所有异步方法使用这个进行统一处理
  const awtRs = async asyncFunc => {
    let apiRes = await awtAsyncFunc(asyncFunc).catch(ex => {
      _showToast({
        title: '系统开⼩差了，程序员⼩哥正在抢修中'
      });
      throw ex;
    });
    // 非200状态码处理
    if (apiRes && apiRes.next && apiRes.httpCode && apiRes.httpCode !== 200) {
      apiRes.next = false;
      if (!Store.pageIsReady) {
        // 非200 页面问题
        goToErrorPage(apiRes.httpCode);
      } else {
        // 非200 操作问题
        switch (apiRes.httpCode) {
          case 400:
            _showToast({
              title: '参数校验错误：' + apiRes.msg
            });
            break;
          case 404:
            _showToast({
              title: '请求错误，请稍后再试'
            });
            break;
          case 500:
            _showToast({
              title: '系统开⼩差了，程序员⼩哥正在抢修中'
            });
            break;
          case 502:
          case 503:
          case 504:
            _showToast({
              title: '网络不给力，请稍后再试'
            });
            break;
          case 506:
            _showToast({
              title: '网络异常，断网了'
            });
          default:
            _showToast({
              title: apiRes.msg || ''
            });
        }
      }
    }
    return apiRes;
  };
  return {
    onload,
    awtRs
  };
};
export default UseBasePage;